﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.Text.RegularExpressions;
using NGI_Enumerador;
using NGI_Entidades;
using NGI_Logica;
using NGI_Auxiliares;
using NGI_Mensaje;

namespace NGI_Sistema.Forms
{
    public partial class ABMClientes : Form
    {
        #region Propiedades
        private Cliente _clienteSeleccionado;

        private ResultadosOperaciones _resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
        private CartelResultadoOperacion car;
        private TiposOperaciones _operacion = TiposOperaciones.Alta;
        private ArrayList _validaciones = new ArrayList();

        public delegate void functioncall(Int32 Id);
        private event functioncall seleccionFunctionPointer;
        private event functioncall eliminacionFunctionPointer;

        private GrillaBusquedaEliminacion gre = new GrillaBusquedaEliminacion(TiposDatos.Cliente, 337);
        #endregion Propiedades


        #region Constructores
        public ABMClientes()
        {
            InitializeComponent();
        }
        
        public ABMClientes(Int32 Id)
        {
            InitializeComponent();
            this.EntidadSeleccionada(Id);
            this.gre.SeleccionarItem(Id);
        }
        #endregion Constructores


        #region Receptor de grilla de búsqueda
        private void EliminarEntidad(Int32 Id)
        {
            try
            {
                this._operacion = TiposOperaciones.Baja;
                Clientes.Eliminar(Id);

                ArrayList ListadoClientes = Clientes.CargarTodos();
                gre.CargarDatos(ListadoClientes);
                this.pnlPersonalizado.Controls.Add(gre);
                this._resultadoUltimaOperacion = ResultadosOperaciones.Exitoso;
                this.LimpiarInputs();
                this.CartelesNegros();
            }
            catch (Exception Ex)
            {
                this._resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
            }
            this.car.ElResultadoFue(this._resultadoUltimaOperacion);
            this.lblOperacion.Text = "Creando cliente.";
        }

        private void EntidadSeleccionada(Int32 Id)
        {
            this._operacion = TiposOperaciones.Modificacion;
            this._clienteSeleccionado = Clientes.TraerDatosDe(Id);
            this.LlenarCampos();
            this.CartelesNegros();

            this.lblOperacion.Text = "Modificando cliente: " + this._clienteSeleccionado.RazonSocial;
            
        }
        #endregion Receptor de grilla de búsqueda


        #region Funciones Privadas
        private void LlenarCampos()
        {
            this.dgvTelefonos.Rows.Clear();
            this.dgvPagos.Rows.Clear();

            this.txtId.Text = this._clienteSeleccionado.ID.ToString();
            this.txtRazonSocial.Text = this._clienteSeleccionado.RazonSocial.ToString();
            this.txtEmail.Text = this._clienteSeleccionado.Email.ToString();
            this.txtDireccion.Text = this._clienteSeleccionado.Direccion.ToString();
            this.txtCUIT.Text = this._clienteSeleccionado.CUIT.ToString();
            this.txtContacto.Text = this._clienteSeleccionado.Contacto.ToString();
            this.txtCodigoPostal.Text = this._clienteSeleccionado.CodigoPostal.ToString();
            this.txtCiudad.Text = this._clienteSeleccionado.Ciudad.ToString();
            this.txtISIB.Text = this._clienteSeleccionado.ISIB.ToString();
            this.txtIngresosBrutos.Text = this._clienteSeleccionado.IngresosBrutos;
            this.txtLocalidad.Text = this._clienteSeleccionado.Localidad;

            this.txtDeudaTotal.Text = this._clienteSeleccionado.Adeudado.ToString();

            this.cmbCategoriaIVA.SelectedValue = this._clienteSeleccionado.CategoriaIVA.ID;
            this.cmbProvincia.SelectedValue = this._clienteSeleccionado.Provincia.ID;

            this.chkActivo.Checked = this._clienteSeleccionado.Activo;

            if (this._clienteSeleccionado.Telefonos != null && this._clienteSeleccionado.Telefonos.Length > 0)
            {
                foreach (Telefono Tel in this._clienteSeleccionado.Telefonos)
                {
                    this.dgvTelefonos.Rows.Add(TipoTelefono.DameIndiceDe(Tel.Tipo), Tel.Numero.ToString(), Tel.Activo ? CheckState.Checked : CheckState.Unchecked);
                }
            }

            if (this._clienteSeleccionado.Pagos != null && this._clienteSeleccionado.Pagos.Length > 0)
            {
                foreach (Pago pago in this._clienteSeleccionado.Pagos)
                {
                    this.dgvPagos.Rows.Add(pago.ID.ToString(), pago.MontoTotal.ToString(), pago.MontoPagado.ToString(), pago.Fecha.ToShortDateString(), pago.Activo ? CheckState.Checked : CheckState.Unchecked);
                }
            }

            this.picCUITValido.Image = new Bitmap(ConfigurationManager.AppSettings["DirectorioRuta"].ToString() + ConfigurationManager.AppSettings["DirectorioRecursos"].ToString() + ConfigurationManager.AppSettings["DirectorioImagenes"].ToString() + ConfigurationManager.AppSettings["DirectorioSistema"].ToString() + ((new CUIT(this.txtCUIT.Text)).EsValido ? CUIT.NombreImagenExitoso : CUIT.NombreImagenNoExitoso), true);
        }

        private void AgregarValidaciones()
        {
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtRazonSocial, this.lblRazonSocial, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtDireccion, this.lblDireccion, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtEmail, this.lblEmail, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtCUIT, this.lblCUIT, TiposValidaciones.Requerido));
        }

        private void CartelesNegros()
        {
            this.lblCategoriaIVA.ForeColor = Color.Black;
            this.lblCiudad.ForeColor = Color.Black;
            this.lblCodigoPostal.ForeColor = Color.Black;
            this.lblContacto.ForeColor = Color.Black;
            this.lblDireccion.ForeColor = Color.Black;
            this.lblEmail.ForeColor = Color.Black;
            this.lblId.ForeColor = Color.Black;
            this.lblRazonSocial.ForeColor = Color.Black;
        }

        private void CargarCategoriasIVA()
        {
            ArrayList ListadoCategoriasIVA = CategoriasIVA.CargarActivos();
            FuncionesFormulario.CargarCombo(this.cmbCategoriaIVA, ListadoCategoriasIVA, "Nombre", "ID");
        }

        private void CargarTiposTelefonos()
        {
            FuncionesFormulario.CargarCombo(this.colTipo, Telefonos.CargarActivos(), "Nombre", "ID");
        }

        private void CargarProvincias()
        {
            ArrayList ListadoProvincias = Provincias.CargarActivos();
            FuncionesFormulario.CargarCombo(this.cmbProvincia, ListadoProvincias, "Nombre", "ID");
            this.cmbProvincia.SelectedIndex = 3;
        }

        private void CrearCartelDeResultados()
        {
            this.car = new CartelResultadoOperacion(pnlCartelResultadoOperacion.Height, pnlCartelResultadoOperacion.Width, (this.pnlCartelResultadoOperacion.Location.Y - pnlCartelResultadoOperacion.Height));
            pnlCartelResultadoOperacion.Controls.Add(car);
        }

        private void LimpiarInputs()
        {
            this.txtContacto.Text = "";
            this.txtDireccion.Text = "";
            this.txtEmail.Text = "";
            this.txtId.Text = "";
            this.txtCodigoPostal.Text = "";
            this.txtRazonSocial.Text = "";
            this.txtCUIT.Text = "";
            this.txtCiudad.Text = "";
            this.txtISIB.Text = "";
            this.txtIngresosBrutos.Text = "";
            this.txtLocalidad.Text = "";
            this.cmbCategoriaIVA.SelectedIndex = 2;
            this.cmbProvincia.SelectedIndex = 3;
            this.dgvTelefonos.Rows.Clear();
            this._clienteSeleccionado = null;
            this.lblOperacion.Text = "Creando cliente.";

            this.dgvTelefonos.Rows.Clear();
            this.dgvPagos.Rows.Clear();
        }

        private Telefono[] GenerarListadoTelefonos()
        {

            Telefono[] Telefonos = new Telefono[this.dgvTelefonos.Rows.Count - 1];

            Int32 a = 0;
            foreach (DataGridViewRow row in this.dgvTelefonos.Rows)
            {
                if (Convert.ToInt32(row.Cells[0].Value) > 0 && row.Cells[1].Value.ToString() != "")
                {
                    Telefonos[a] = Telefono.Nuevo(this.TipoTelefonoPorIndice(Convert.ToInt32(row.Cells[0].Value)), row.Cells[1].Value.ToString(), Convert.ToBoolean(row.Cells[2].Value));
                    a++;
                }
            }

            return Telefonos;
        }

        private Pago[] GenerarListadoPagos(Cliente unCliente)
        {

            Pago[] Pagos = new Pago[this.dgvPagos.Rows.Count - 1];

            Int32 a = 0;
            foreach (DataGridViewRow row in this.dgvPagos.Rows)
            {


                if (Convert.ToDouble(row.Cells[1].Value) > 0 && Convert.ToDouble(row.Cells[2].Value) > 0 && (new Regex(@"^\d\d/\d\d/\d\d\d\d")).IsMatch(row.Cells[3].Value.ToString()))
                {
                    Double total = !String.IsNullOrEmpty(row.Cells[1].Value.ToString()) ? Convert.ToDouble(row.Cells[1].Value) : 0;
                    Double pagado = !String.IsNullOrEmpty(row.Cells[2].Value.ToString()) ? Convert.ToDouble(row.Cells[2].Value) : 0;
                    Int32[] selectedDate = new Int32[3];
                    selectedDate[0] = !String.IsNullOrEmpty(row.Cells[3].Value.ToString()) ? Convert.ToInt32(row.Cells[3].Value.ToString().Split('/')[0]) : 0;
                    selectedDate[1] = !String.IsNullOrEmpty(row.Cells[3].Value.ToString()) ? Convert.ToInt32(row.Cells[3].Value.ToString().Split('/')[1]) : 0;
                    selectedDate[2] = !String.IsNullOrEmpty(row.Cells[3].Value.ToString()) ? Convert.ToInt32(row.Cells[3].Value.ToString().Split('/')[2]) : 0;
                    DateTime fechaElegida = new DateTime(selectedDate[2], selectedDate[1], selectedDate[0]);

                    Pagos[a] = Pago.Nuevo(unCliente, total, pagado, fechaElegida, Convert.ToBoolean(row.Cells[4].Value));
                    a++;
                }
            }

            return Pagos;
        }


        private TiposTelefonos TipoTelefonoPorIndice(Int32 Indice)
        {
            switch (Indice)
            {
                case 1:
                    return TiposTelefonos.Fijo;
                case 2:
                    return TiposTelefonos.Celular;
                case 3:
                    return TiposTelefonos.Fax;
                default:
                    return TiposTelefonos.Fijo;
            }
        }

        private Boolean CamposValidos()
        {
            Boolean CamposValidos = FuncionesFormulario.TodosLosCamposValidos(this._validaciones);
            return (new CUIT(this.txtCUIT.Text)).EsValido && CamposValidos;
        }
        #endregion Funciones Privadas


        #region Eventos
        private void ABMClientes_Load(object sender, EventArgs e)
        {
            this.CrearCartelDeResultados();
            
            seleccionFunctionPointer += new functioncall(EntidadSeleccionada);
            eliminacionFunctionPointer += new functioncall(EliminarEntidad);
            gre.seleccionFunctionPointer = seleccionFunctionPointer;
            gre.eliminacionFunctionPointer = eliminacionFunctionPointer;

            if (this._clienteSeleccionado == null)
                this.lblOperacion.Text = "Creando cliente.";

            this.AgregarValidaciones();
            this.CargarCategoriasIVA();
            this.CargarTiposTelefonos();
            this.CargarProvincias();

            ArrayList ListadoClientes = Clientes.CargarTodos();
            gre.CargarDatos(ListadoClientes);
            this.pnlPersonalizado.Controls.Add(gre);
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            this.CartelesNegros();

            if (this.CamposValidos())
            {

                Cliente unCliente = new Cliente();
                Boolean CheckboxState = this.chkActivo.CheckState == CheckState.Checked ? true : false;
                Provincia unaProvincia = Provincia.DatosMinimos(Convert.ToInt32(this.cmbProvincia.SelectedValue));
                Telefono[] ListadoTelefonos = this.GenerarListadoTelefonos();

                try
                {
                    switch (this._operacion)
                    {
                        case TiposOperaciones.Alta:
                            unCliente = Cliente.Nuevo(this.txtCUIT.Text, this.txtRazonSocial.Text, this.txtEmail.Text, this.txtDireccion.Text, this.txtCodigoPostal.Text, this.txtCiudad.Text, this.txtLocalidad.Text, unaProvincia, this.txtContacto.Text, this.txtIngresosBrutos.Text, Convert.ToInt32(this.txtISIB.Text), 0, CategoriaIVA.DatosMinimos(Convert.ToInt32(this.cmbCategoriaIVA.SelectedValue)), ListadoTelefonos, CheckboxState);
                            int id = Clientes.Crear(unCliente, Program.SesionActiva.UsuarioLogueado.ID);
                            unCliente.ID = id;
                            break;
                        case TiposOperaciones.Modificacion:
                            unCliente = Cliente.Existente(Convert.ToInt32(this.txtId.Text), this.txtCUIT.Text, this.txtRazonSocial.Text, this.txtEmail.Text, this.txtDireccion.Text, this.txtCodigoPostal.Text, this.txtCiudad.Text, this.txtLocalidad.Text, unaProvincia, this.txtContacto.Text, this.txtIngresosBrutos.Text, Convert.ToInt32(this.txtISIB.Text), 0, CategoriaIVA.DatosMinimos(Convert.ToInt32(this.cmbCategoriaIVA.SelectedValue)), ListadoTelefonos, CheckboxState);
                            Clientes.Modificar(unCliente, Program.SesionActiva.UsuarioLogueado.ID);
                            break;
                    }

                    Pago[] ListadoPagos = this.GenerarListadoPagos(unCliente);
                    Clientes.EliminarTelefonos(unCliente);
                    Clientes.InsertarTelefonos(unCliente, Program.SesionActiva.UsuarioLogueado.ID);

                    Clientes.EliminarPagos(unCliente);
                    this.InsertarPagos(ListadoPagos, Program.SesionActiva.UsuarioLogueado.ID);

                    this._resultadoUltimaOperacion = ResultadosOperaciones.Exitoso;
                    ArrayList ListadoClientes = Clientes.CargarTodos();
                    gre.CargarDatos(ListadoClientes);

                    this.LimpiarInputs();
                }
                catch (Exception Ex)
                {
                    this._resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
                }

                this.gre.DeseleccionarOpcion();
            }
            else
            {
                this._resultadoUltimaOperacion = ResultadosOperaciones.CamposMinimosNoCompletados;
            }
            this.car.ElResultadoFue(this._resultadoUltimaOperacion);
        }

        private void InsertarPagos(Pago[] listadoPagos, Int32 usuarioLogueado)
        {
            foreach (Pago unPago in listadoPagos){
                Pagos.Crear(unPago, usuarioLogueado);
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            this.lblOperacion.Text = "Creando proveedor.";
            this._operacion = TiposOperaciones.Alta;
            this.LimpiarInputs();
            this.CartelesNegros();
            this.gre.DeseleccionarOpcion();

            this.picCUITValido.Image = new Bitmap(ConfigurationManager.AppSettings["DirectorioRuta"].ToString() + ConfigurationManager.AppSettings["DirectorioRecursos"].ToString() + ConfigurationManager.AppSettings["DirectorioImagenes"].ToString() + ConfigurationManager.AppSettings["DirectorioSistema"].ToString() + ((new CUIT(this.txtCUIT.Text)).EsValido ? CUIT.NombreImagenExitoso : CUIT.NombreImagenNoExitoso), true);
        }

        private void txtCUIT_TextChanged(object sender, EventArgs e)
        {
            if (this.txtCUIT.Text.Length == 2 || this.txtCUIT.Text.Length == 11)
            {
                this.txtCUIT.Text += "-";
            }

            this.txtCUIT.Select(this.txtCUIT.Text.Length, 0);

            this.picCUITValido.Image = new Bitmap(ConfigurationManager.AppSettings["DirectorioRuta"].ToString() + ConfigurationManager.AppSettings["DirectorioRecursos"].ToString() + ConfigurationManager.AppSettings["DirectorioImagenes"].ToString() + ConfigurationManager.AppSettings["DirectorioSistema"].ToString() + ((new CUIT(this.txtCUIT.Text)).EsValido ? CUIT.NombreImagenExitoso : CUIT.NombreImagenNoExitoso), true);
        }

        private void txtCUIT_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Funciones.EsNumeroOBackSpace(e.KeyChar);
        }

        private void txtISIB_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Funciones.EsNumero(e.KeyChar);
        }
        #endregion Eventos

    }
}
